#include "ListaOrdenada.h"


void TlistaOrdenada_Crear(struct TlistaOrdenada *LO, size_t tamanio){
    L_Crear(&(LO->ListaSimple), tamanio);
}

int TlistaOrdenada_Vaciar(struct TlistaOrdenada *LO){
    L_Vaciar(&(LO->ListaSimple));
    return 0;
}


int TlistaOrdenada_Vacia(struct TlistaOrdenada *LO){
    return L_Vacia(LO->ListaSimple);
}




int TlistaOrdenada_Insertar(struct TlistaOrdenada *LO, struct Elemento Elemento){
    struct Elemento corriente;

/** Si la lista esta vacia, inserto el elemento primero*/
    if(L_Vacia(LO->ListaSimple))
        return L_Insertar_Cte(&(LO->ListaSimple), L_Primero, &Elemento);

/**Leo el corriente, y en caso de ser menor al elemento recibido, lo muevo al principio*/
    L_Elem_Cte(LO->ListaSimple,&corriente);

    if(strcmp(corriente.Clave,Elemento.Clave)>0)
        L_Mover_Cte(&(LO->ListaSimple), L_Primero);

/**Leo el corriente, y recorro la lista hasta encontrar el lugar correcto*/
    L_Elem_Cte(LO->ListaSimple,&corriente);

    while((strcmp(corriente.Clave,Elemento.Clave)>0) || L_Mover_Cte(&(LO->ListaSimple), L_Siguiente)){
        L_Elem_Cte(LO->ListaSimple,&corriente);
        if(strcmp(Elemento.Clave,corriente.Clave)<0)
            break;
    }

    return (strcmp(Elemento.Clave,corriente.Clave)<0)?
        L_Insertar_Cte(&(LO->ListaSimple), L_Anterior, &Elemento):
        L_Insertar_Cte(&(LO->ListaSimple), L_Siguiente, &Elemento);
}




int TlistaOrdenada_Obtener(struct TlistaOrdenada *LO,char* clave,char* buffer){
    struct Elemento corriente;

/**Leo el corriente, y en caso de ser menor al elemento recibido, lo muevo al principio*/
    L_Elem_Cte(LO->ListaSimple,&corriente);

    if(strcmp(corriente.Clave,clave)>0)
        L_Mover_Cte(&(LO->ListaSimple), L_Primero);

/**Leo el corriente, y recorro la lista hasta encontrar el lugar correcto*/
    L_Elem_Cte(LO->ListaSimple,&corriente);

    while((strcmp(corriente.Clave,clave)==0) || L_Mover_Cte(&(LO->ListaSimple), L_Siguiente)){
        L_Elem_Cte(LO->ListaSimple,&corriente);
        if(strcmp(clave,corriente.Clave)==0)
            break;
    }

    if(strcmp(clave,corriente.Clave)==0)
        strcpy(buffer,corriente.Valor);

    return 0;

}


int TlistaOrdenada_SizeDato(struct TlistaOrdenada *LO,char* clave){

    struct Elemento corriente;

/**Leo el corriente, y en caso de ser menor al elemento recibido, lo muevo al principio*/
    L_Elem_Cte(LO->ListaSimple,&corriente);

    if(strcmp(corriente.Clave,clave)>0)
        L_Mover_Cte(&(LO->ListaSimple), L_Primero);

/**Leo el corriente, y recorro la lista hasta encontrar el lugar correcto*/
    L_Elem_Cte(LO->ListaSimple,&corriente);

    while((strcmp(corriente.Clave,clave)==0) || L_Mover_Cte(&(LO->ListaSimple), L_Siguiente)){
        L_Elem_Cte(LO->ListaSimple,&corriente);
        if(strcmp(clave,corriente.Clave)==0)
            break;
    }

    return (strcmp(clave,corriente.Clave)==0)?
        (sizeof(char) * strlen(corriente.Valor)):
         0;
}
